async function hook($req = request, $resp = response, $modules = modules) {
    //通讯录回调:https://work.weixin.qq.com/api/doc/90000/90135/90967
    //外部联系回调:https://work.weixin.qq.com/api/doc/90000/90135/92129
    //OA审批回调:https://work.weixin.qq.com/api/doc/90000/90135/91815

    //get 请求用于验证有效性
    if ($req.method == "GET") {
        /**
         * 企业收到消息后，需要作如下处理：
         * 1、对msg_signature进行校验
         * 2、解密Encrypt，得到明文的消息结构体（消息结构体后面章节会详说）
         * 3、如果需要被动回复消息，构造被动响应包
         * 4、正确响应本次请求
         * 以上1~2步骤可以直接使用解密函数一步到位。
         * 3步骤其实包含加密被动回复消息、生成新签名、构造被动响应包三个步骤，可以直接使用加密函数一步到位。
         */
        $resp.body = await $modules.wxworkApi.getVerifyMsg($req);
    } else if ($req.method == "POST") {

        //无法保证在五秒内处理完成，先回复（企业微信服务器在五秒内收不到响应会断掉连接）
        $resp.body = "success";

        //处理
        let handle = async () => {
            //将数据解密并转换成json
            let data = await $modules.wxworkApi.getMsgData($req);

            if (data.Event == "change_contact" && data.ChangeType == "create_party") {
                //TODO 处理添加部门事件

            } else if (data.Event == "change_contact" && data.ChangeType == "update_party") {

                //TODO 处理修改部门事件

            } else if (data.Event == "change_contact" && data.ChangeType == "delete_party") {

                //TODO 处理删除部门事件

            } else if (data.Event == "change_contact" && data.ChangeType == "create_user") {

                //TODO 处理添加成员事件

            } else if (data.Event == "change_contact" && data.ChangeType == "update_user") {

                //TODO 处理修改成员事件

            } else if (data.Event == "change_contact" && data.ChangeType == "delete_user") {

                //TODO 处理删除成员事件

            } else if (data.Event == "change_external_contact" && data.ChangeType == "add_external_contact") {
                //TODO 处理添加外部联系人事件

            } else if (data.Event == "change_external_contact" && data.ChangeType == "edit_external_contact") {

                //TODO 处理编辑外部联系人备注标签信息事件

            } else if (data.Event == "change_external_contact" && data.ChangeType == "del_external_contact") {

                //TODO 处理删除外部联系人事件

            }

        }
        handle();
    }
}